package utils

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

func searchObsStudio(root string, maxDepth int) (string, error) {
	targetFolder := "obs-studio"
	targetFile := "bin\\64bit\\obs64.exe"

	var foundPath string
	found := false
	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
		if err != nil {
            fmt.Println("errL18:", path,err.Error())
			return nil
		}

        // 如果遇到的是个文件，需要继续寻找，
        // 源码里面 walk 遇到文件直接就停止寻找了
        if !info.IsDir(){
           return nil // 继续寻找下个兄弟目录
        }

		fmt.Println("......", path)
		// 检查是否为目标文件夹
		if info.IsDir() && strings.Index(strings.ToLower(info.Name()), targetFolder) == 0 {
			fmt.Println("找到了。。。")
			// 在目标文件夹下查找目标文件
			filePath := filepath.Join(path, targetFile)
			_, err = os.Stat(filePath)
			if err == nil {
				fmt.Println("找到了2。。。")
				foundPath = filePath
				found = true
				return filepath.SkipDir // 跳过当前目录的子目录
			}
		}

		// 控制搜索的层级
		depth := len(strings.Split(path, "\\"))
		// depth := len(filepath.SplitList(path)) - len(filepath.SplitList(root))
		if depth >= maxDepth {
            fmt.Println("jump...",path)
			return filepath.SkipDir // 超过最大层级，跳过当前目录的子目录
		}

		return nil
	})

	if err != nil {
		return "", err
	}

	if !found {
		return "", fmt.Errorf("未找到目标文件")
	}
	return foundPath, nil
}

func FindsObsPath() string {
	// 获取系统中的所有盘符
	//driveLetters := []string{"A:\\", "B:\\", "C:\\", "D:\\", "E:\\", "F:\\", "G:\\", "H:\\", "I:\\", "J:\\", "K:\\", "L:\\", "M:\\", "N:\\", "O:\\", "P:\\", "Q:\\", "R:\\", "S:\\", "T:\\", "U:\\", "V:\\", "W:\\", "X:\\", "Y:\\", "Z:\\"}
	driveLetters := []string{"C:\\Program Files"}

	fmt.Println(driveLetters)

	// 遍历每个盘符进行搜索
	for _, drive := range driveLetters {

		foundPath, err := searchObsStudio(drive, 3)
		if err != nil {
			fmt.Printf("在盘符 %s 中搜索过程中发生错误：%v\n", drive, err)
			continue
		}

		if foundPath != "" {
			fmt.Println("找到目标文件：", foundPath)
			return foundPath
		}
	}

	fmt.Println("未找到目标文件")
	return ""
}
